<?php
/**
 * Classe que usa o padrão Data Access Object para criar, ler, atualizar e deletar no banco de dados objetos do tipo Inscricao
 * @name InscricaoDAO
 * @author Fabio Cezar Baía baiacfabio@gmail.com
 * @since 13/06/2013 15:52:51
 */
class InscricaoDAO extends DAO{
		
		
	/**
	 * Persiste uma nova Inscricao no banco de dados ou atualiza caso ja exista
	 * @access public
     * @name save
	 * @param Inscricao $inscricao
	 * @since 24/04/2013 21:28:26
	 */
	public function save( Inscricao $inscricao ) {		
		
		if($inscricao->getId() == ""){			
			$this->insert($inscricao);		
		}else{
			$this->update($inscricao);		
		}
				
	}
	
	/**
	* Insere um novo Inscricao no banco de dados
	* @access private
	* @name insert
	* @param Inscricao $inscricao
	* @since 13/06/2013 15:53:21
	*/
	private function insert(Inscricao $inscricao) {
		try{				
			$stmt = $this->db->prepare("INSERT INTO `{$this->entity}` (nome, descricao, inicio, termino, inicioInscricao, terminoInscricao, valorUnico, valor, certificadoUnico, dataModificacao) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
			$stmt->bindValue(1, utf8_decode( $inscricao->getNome() ) );
			$stmt->bindValue(2, utf8_decode( $inscricao->getDescricao() ));
			$stmt->bindValue(3, $inscricao->getInicio() );
			$stmt->bindValue(4, $inscricao->getTermino() );
			$stmt->bindValue(5, $inscricao->getInicioInscricao() );
			$stmt->bindValue(6, $inscricao->getTerminoInscricao() );
			$stmt->bindValue(7, $inscricao->isValorUnico() );
			$stmt->bindValue(8, $inscricao->getValor() );
			$stmt->bindValue(9, $inscricao->isCertificadoUnico() );		
			$stmt->bindValue(10, $inscricao->getDataModificacao()->format('dd/mm/AAAA') );
			$stmt->execute();
			
			//SystemMessage::createMessage("Inscricao cadastrado com sucesso!", SystemMessage::TYPE_SUCCESS);
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			//SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
	}
	
	/**
	* Atualiza um Inscricao no banco de dados
	* @access private
	* @name update
	* @param Inscricao $inscricao
	* @since 24/04/2013 21:37:31
	*/
	private function update(Inscricao $inscricao) {

		try{
			
			$stmt = $this->db->prepare("UPDATE `{$this->entity}` set nome = ?, descricao = ?, inicio = ?, termino = ?, inicioInscricao = ?, terminoInscricao = ?, valorUnico = ?, valor = ?, certificadoUnico = ?, dataModificacao = ? WHERE id = ?");
			$stmt->bindValue(1, utf8_decode( $inscricao->getNome() ) );
			$stmt->bindValue(2, utf8_decode( $inscricao->getDescricao() ));
			$stmt->bindValue(3, $inscricao->getInicio() );
			$stmt->bindValue(4, $inscricao->getTermino() );
			$stmt->bindValue(5, $inscricao->getInicioInscricao() );
			$stmt->bindValue(6, $inscricao->getTerminoInscricao() );
			$stmt->bindValue(7, $inscricao->isValorUnico() );
			$stmt->bindValue(8, $inscricao->getValor() );
			$stmt->bindValue(9, $inscricao->isCertificadoUnico() );			
			$stmt->bindValue(10, $inscricao->getDataModificacao() );
			$stmt->bindValue(11, $inscricao->getId() );
			
			SystemMessage::createMessage("Inscricao atualizado com sucesso!", SystemMessage::TYPE_SUCCESS);
			
			
			$stmt->execute();
			// fecho a conexão
			$this->db = null;		
			
			
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
		
	}
	
	/**
	* Obtem um Inscricao do banco com base no id
	* @access public
	* @name get
	* @param int $id Id do Inscricao a ser obtido
	* @since 24/04/2013 21:42:12
	* @return Inscricao
	*/
	public function get($id) {
		$inscricao = new Inscricao();
		
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
			$stmt->execute();
			
			$obj = $stmt->fetchObject();
			$inscricao->setId($obj->id);
			$inscricao->setNome($obj->nome);
			$inscricao->setDescricao($obj->descricao);
			$inscricao->setInicio($obj->inicio);
			$inscricao->setTermino($obj->termino);
			$inscricao->setInicioInscricao($obj->inicioInscricao);
			$inscricao->setTerminoInscricao($obj->terminoInscricao);
			$inscricao->setValorUnico($obj->valorUnico);
			$inscricao->setValor($obj->valor);
			$inscricao->setCertificadoUnico($obj->certificadoUnico);
			$inscricao->setDataModificacao($obj->dataModificacao);
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}		
		
		return $inscricao;
	}
	
	/**
	* Lista todos os Inscricaos do banco
	* @access public
	* @name listAll
	* @since 24/04/2013 01:13:22
	* @return array Array de Inscricaos
	*/
	public function listAll() {
		$lista = array();
		
		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}`");
			$stmt->execute();
			
			while ($obj = $stmt->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_NEXT)) {
				$inscricao = new Inscricao();
				$inscricao->setId($obj->id);
				$inscricao->setNome($obj->nome);
				$inscricao->setDescricao($obj->descricao);
				$inscricao->setInicio($obj->inicio);
				$inscricao->setTermino($obj->termino);
				$inscricao->setInicioInscricao($obj->inicioInscricao);
				$inscricao->setTerminoInscricao($obj->terminoInscricao);
				$inscricao->setValorUnico($obj->valorUnico);
				$inscricao->setValor($obj->valor);
				$inscricao->setCertificadoUnico($obj->certificadoUnico);
				$inscricao->setDataModificacao($obj->dataModificacao);
				
				$lista[] = $inscricao;
			}			
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}
		
		return $lista;
	}
	
	/**
	* @access public
	* @name listaPresenca
	* @param $evento, $atividade
	* @since 13/06/2013 19:22:20
	*/
	public function listaPresenca($eventoAtivo, $atividadeId) {
		$lista = array();
		
		if($atividadeId != ""){
			$query = "SELECT i.id as id_inscricao, i.dataInscricao,
		p.id as id_participante, p.nome, p.rg, p.cpf,
		a.id as id_atividade, a.nome as nome_atividade, a.descricao as descricao_atividade, a.valor, a.cargaHoraria
		FROM inscricao i, participante p, atividade a
		WHERE i.evento_id = '".$eventoAtivo->getId()."' AND i.participante_id = p.id AND a.evento_id = i.evento_id AND a.id = '".$atividadeId."'";
		}else{
			$query = "SELECT i.id as id_inscricao, i.dataInscricao,
		p.nome, p.rg, p.cpf,
		a.nome as nome_atividade, a.descricao as descricao_atividade, a.valor, a.cargaHoraria
		FROM inscricao i, participante p, atividade a
		WHERE i.evento_id = '".$eventoAtivo->getId()."' AND i.participante_id = p.id AND a.evento_id = i.evento_id";
		}
		
		$result = mysql_query($query);
		
		while($dados = mysql_fetch_assoc($result)){
			$inscricao = new Inscricao();
			$participante = new Participante();
			$atividade = new Atividade();
		
			//$participante->setNome($dados["nome"]);
			//$participante->setRG($dados["rg"]);
			//$participante->setCPF($dados["cpf"]);
			$participanteDAO = new ParticipanteDAO();
			$participante = $participanteDAO->get($dados["id_participante"]);
			
			//$atividade->setNome($dados["nome_atividade"]);
			//$atividade->setDescricao($dados["descricao_atividade"]);
			//$atividade->setValor($dados["valor"]);
			//$atividade->setCargaHoraria($dados["cargaHoraria"]);
			$atividadeDAO = new AtividadeDAO();
			$atividade = $atividadeDAO->get($dados["id_atividade"]);
			
			
			
			$inscricao->setEvento($entityManager->find("Evento", $eventoAtivo->getId()));
			$inscricao->setParticipante($participante);
			
		}
		
	}
	
	
	/**
	* Remove um Inscricao do banco com base no id
	* @access public
	* @name delete
	* @param int $id Id do Inscricao a ser deletado
	* @since 24/04/2013 21:52:32
	*/
	public function delete($id) {
		try{
			$stmt = $this->db->prepare("DELETE FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
			
			
			if($stmt->execute()){
				SystemMessage::createMessage("Inscricao removido com sucesso!", SystemMessage::TYPE_SUCCESS);
			}else{
				SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR);
			}		
			
			
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
	
	}

}


